#pragma once
#include <boost/noncopyable.hpp>
#include "ImportExport.hpp"

namespace he
{
	//! Management of camera.
	/*!
		This camera is repsonsible for creating the camera and then settings
		some other attributes if needed.
	*/
	class CameraManager : boost::noncopyable
	{
		// Attributes
	private:
		//! Scene manager.
		Ogre::SceneManager &m_SceneManager;
		//! Camera instance.
		Ogre::Camera *m_pCamera;
		//! Camera angel.
		float const m_Angle;
		//! Viewport associated with this camera.
		Ogre::Viewport *m_pViewPort;
		//! Is debug camera shown.
		bool m_DebugCamera;

		// Operations
	public:
		//! Set camera size, position to match given world units.
		/*!
			\param WorldWidth size of world units for width of screen.
			\param WorldHeight size of world units for height of screen.
			\param MaxY maximum size in y axis to be able to fit in camera
				view.
		*/
		HE_ENGINE_API void set_camera_position(float WorldWidth, float WorldHeight, float MaxY);
		//! Switch to debug camera.
		HE_ENGINE_API void switch_debug_camera();
		//! Get main camera.
		HE_ENGINE_API Ogre::Camera const &main_camera() const;
		//! Get main camera.
		HE_ENGINE_API Ogre::Camera &main_camera();
		//! Move main camera relative to it's position.
		HE_ENGINE_API void move_main_camera_relative(Ogre::Vector3 const &Pos);

		// Construction/Destruction
	public:
		HE_ENGINE_API CameraManager(Ogre::SceneManager &SceneManager, Ogre::RenderWindow &RenderWindow, std::string const &Camera);
	};
} /*he*/
